import dash
from dash import html, dcc, dash_table
import dash_bootstrap_components as dbc
import plotly.graph_objects as go
import plotly.express as px
import pandas as pd
import numpy as np
from datetime import datetime, date
from flask import session # 确保导入 session
from models import Organization, Department, Product 
from sqlalchemy import func # 确保导入 func
from dash import html, dcc, callback_context

#下排第一列
def create_equipment_type_filter_panel():
    org_code = session.get('current_org_code', session.get('user_org_code', ''))
    org_short_name_c = None
    equipment_by_category = {}
    equipment_categories = []
    if org_code:
        org = Organization.query.filter_by(org_code=org_code).first()
        if org and org.short_name_c:
            org_short_name_c = org.short_name_c
    # if org_short_name_c == "外滩":
        products = Product.query.filter_by(org_short_name_c=org_short_name_c).all()
        for p in products:
            cat = p.equipment_category or "未分类"
            if cat not in equipment_by_category:
                equipment_by_category[cat] = []
                equipment_categories.append(cat)
            # 修复设备名称显示，避免空括号
            display_name = p.product_name
            if p.model and p.model.strip():
                display_name += f"（{p.model}）"
            equipment_by_category[cat].append({'id': p.id, 'name': display_name})
   
       
    # 使用 dbc.Collapse 替代 Accordion 来实现真正的折叠功能
    collapse_items = []
    for i, cat in enumerate(equipment_categories):
        equip_list = equipment_by_category[cat]
        
        # 创建类别标题按钮
        category_button = dbc.Button(
            [html.I(className="fas fa-plus me-2", id=f"icon-{i}"), cat],
            id=f"collapse-button-{i}",
            className="mb-2",
            color="secondary",
            outline=True,
            style={
                'width': '100%',
                'textAlign': 'left',
                'backgroundColor': 'transparent',
                'borderColor': '#444',
                'color': 'white'
            }
        )
        
        # 创建可折叠的设备列表
        collapse_content = dbc.Collapse(
            html.Div([
                dcc.Checklist(
                    options=[{'label': e['name'], 'value': e['id']} for e in equip_list],
                    value=[],
                    id={'type': 'equipment-checklist', 'index': cat},
                    style={
                        'color': 'white', 
                        'marginLeft': '20px',
                        'maxHeight': '150px',
                        'overflowY': 'auto'
                    }
                )
            ]) if equip_list else html.Div("无设备", style={'color': '#888', 'marginLeft': '20px'}),
            id=f"collapse-{i}",
            is_open=False
        )
        
        collapse_items.extend([category_button, collapse_content])
    
    return html.Div([
        html.H3("  |  设备分类", style={"color": "white", "fontSize": "18px", "marginBottom": "15px", "textAlign": "left"}),
        html.Div(
            collapse_items,
            style={
                'maxHeight': '400px',
                'overflowY': 'auto',
                'paddingRight': '10px'
            }
        )
    ], style={
        "backgroundColor": "#101b41",
        "border": "1px solid #444",
        "padding": "15px",
        "height": "95%",
        "overflow": "auto"
    })

# 创建全院设备综合分析面板（下排第2列）
def create_equipment_analysis_panel():
    from flask import session
    from models import Product, Organization
    from datetime import datetime
    import numpy as np
    
    # 获取当前机构信息
    org_code = session.get('current_org_code', session.get('user_org_code', ''))
    
    # 初始化数据
    x_data = []
    y_data = []
    text_data = []
    sizes = []
    
    if org_code:
        org = Organization.query.filter_by(org_code=org_code).first()
        if org and org.short_name_c:
            # 查询属于该机构且有效的设备
            products = Product.query.filter_by(
                org_short_name_c=org.short_name_c,
                is_active=True
            ).all()
            
            current_date = datetime.now().date()
            
            for product in products:
                # 计算年限指数
                if product.purchase_date and product.service_life and product.service_life > 0:
                    # 计算使用年限（当前日期 - 购买日期）
                    years_used = (current_date - product.purchase_date).days / 365.25
                    # 年限指数 = 使用年限 / 设计使用年限
                    age_index = years_used / product.service_life
                    
                    # 只显示有价格和年限指数的设备
                    if product.price and product.price > 0:
                        x_data.append(product.price)
                        y_data.append(age_index)
                        text_data.append(product.product_name or f'设备{product.id}')
                        # 根据价格设置点的大小
                        sizes.append(max(10, min(50, product.price / 10)))
    
    # 如果没有数据，使用默认数据
    if not x_data:
        np.random.seed(42)
        x_data = np.random.uniform(10, 200, 20).tolist()
        y_data = np.random.uniform(0, 2, 20).tolist()
        text_data = [f'设备{i+1}' for i in range(20)]
        sizes = [20] * 20
    
    fig = go.Figure()
    
    fig.add_trace(go.Scatter(
        x=x_data,
        y=y_data,
        mode='markers',
        marker=dict(
            size=sizes,
            color=['#00d4ff', '#00ff88', '#ffaa00', '#ff6b6b'] * (len(x_data)//4 + 1),
            opacity=0.7,
            line=dict(width=1, color='white')
        ),
        text=text_data,
        hovertemplate='<b>%{text}</b><br>价格: %{x}万元<br>年限指数: %{y:.2f}<extra></extra>'
    ))
    
    # 计算最大年限指数
    max_age_index = max(y_data) if y_data else 2  # 如果没有数据，使用默认值2
    
    # 生成刻度值
    tickvals = [i * max_age_index / 8 for i in range(9)]
    
    fig.update_layout(
        title=dict(
            text="",
            font=dict(color='white', size=16),
            x=0.05,
            y=0.95,
            xanchor='left',
            yanchor='top'
        ),
        xaxis=dict(
            title=dict(
                text="价格(万元)",
                font=dict(color='white')
            ),
            tickfont=dict(color='white'),
            gridcolor='#2a3f7a'
        ),
        yaxis=dict(
            title=dict(
                text="年限指数",
                font=dict(color='white')
            ),
            tickfont=dict(color='white'),
            gridcolor='#2a3f7a',
            tickvals=tickvals  # 动态设置刻度
        ),
        paper_bgcolor='rgba(0,0,0,0)',
        plot_bgcolor='#1a2b5c',
        margin=dict(t=20, b=20, l=60, r=60),
        height=None
    )
    
    return html.Div([
        html.Div([
            html.H3("  |  全院设备综合分析", style={
                "color": "white",
                "fontSize": "18px",
                "marginRight": "500px",
                "textAlign": "left"
            }),
            html.Button("设备", id="equipment-btn", 
                       style={'backgroundColor': '#4A90E2', 'color': 'white', 'border': 'none', 
                             'padding': '8px 16px', 'marginRight': '10px', 'borderRadius': '4px'}),
            html.Button("科室", id="department-btn", 
                       style={'backgroundColor': '#666', 'color': 'white', 'border': 'none', 
                             'padding': '8px 16px', 'borderRadius': '4px'})
        ], style={'display': 'flex', 'alignItems': 'center', 'marginBottom': '1px', 'gap': '1px'}),
        dcc.Graph(
            id='equipment-analysis-graph', 
            figure=fig, 
            config={'displayModeBar': False},
            style={
                'minHeight': '415px',  # 设置最小高度
                'height': '100%',     # 同时保持100%高度
                'width': '100%'
            }
        )
    ], style={
        "backgroundColor": "#101b41",
        "border": "1px solid #444",
        "padding": "15px",
        "height": "100%",  # 确保使用百分比高度
        "display": "flex",
        "flexDirection": "column"
    })

    
# 创建明细预览面板（下排第3列）
def create_detail_preview_panel():
    # 从session中获取当前机构代码
    from flask import session
    from models import Product
    from dash import html, dcc, dash_table
    
    # 获取当前机构信息
    org_code = session.get('current_org_code', session.get('user_org_code', ''))
    
    # 初始化表格数据
    table_data = []
    
    if org_code:
        # 从数据库中查询属于当前机构的设备
        from models import Organization
        org = Organization.query.filter_by(org_code=org_code).first()
        
        if org and org.short_name_c:
            # 查询属于该机构的设备，按价格降序排列
            products = Product.query.filter_by(org_short_name_c=org.short_name_c).order_by(Product.price.desc()).all()
            
            for product in products:
                # 计算年限指数（如果有service_life字段）
                service_life = product.service_life or 0
                year_index = round(service_life / 10, 2) if service_life else 0
                
                # 格式化价格为"xx.xx万元"
                price_str = f"{product.price:.2f}元" if product.price else "0.00万元"
                
                # 计算折旧金额（假设按照直线折旧法计算）
                # 这里假设使用年限为10年，超过10年折旧为0
                depreciation = product.price
                if service_life < 10 and product.price:
                    depreciation = product.price * (1 - service_life / 10)
                depreciation_str = f"{depreciation:.2f}元" if depreciation is not None else "0.00元"
                
                table_data.append({
                    '设备名称': product.product_name or '',
                    '设备型号': product.manufacturer or  product.model or '',
                    '设备金额': price_str,
                    # '折旧金额': depreciation_str,
                    '年限指数': f"{year_index}"
                })
    
    # 如果没有数据，使用默认数据
    if not table_data:
        table_data = [
            {'设备名称': '医用诊断DRX光机（工字型）', '设备型号': 'Q-Rad', '设备金额': '129.00万元', '折旧金额': '129.00万元', '年限指数': '1.73'},
            {'设备名称': '迈瑞彩超彩色多普勒超声系统', '设备型号': 'DC-80PRO', '设备金额': '78.20万元', '折旧金额': '72.02万元', '年限指数': '0.92'},
            {'设备名称': '全自动超声骨密度仪', '设备型号': 'VINNO E30', '设备金额': '49.80万元', '折旧金额': '49.80万元', '年限指数': '1.56'},
            {'设备名称': '迈瑞彩超彩色多普勒超声系统', '设备型号': 'M7', '设备金额': '48.00万元', '折旧金额': '44.21万元', '年限指数': '0.92'}
        ]
    
    return html.Div([
        html.Div([

            
            # 将原来的html.H3替换为html.A
            html.A("| 明细预览", 
                href="/dash/equipment", 
                target="_blank",  # 在新标签页打开
                id="branch-detail-preview-link",
                style={
                    "color": "white",
                    "fontSize": "18px",
                    "bold": True,
                    "margin": "0",
                    "display": "inline-block",
                    "textAlign": "left",  
                    "cursor": "pointer"  # 鼠标悬停时显示手型
                }
            ),
            html.Div([
                dcc.Input(
                    id='branch-equipment-name-filter',
                    placeholder='设备名称',
                    style={
                        'width': '120px',
                        'marginRight': '10px',
                        'backgroundColor': '#2a3f7a',
                        'border': '1px solid #4a5f9a',
                        'color': 'white',
                        'padding': '5px'
                    }
                ),
                html.Button(
                    "明细预览",
                    id="branch-detail-preview-button",
                    style={
                        'backgroundColor': '#1890ff',
                        'color': 'white',
                        'border': 'none',
                        'padding': '6px 12px',
                        'borderRadius': '4px',
                        'fontSize': '12px',
                        'marginRight': '10px'
                    }
                ),
                html.Button(
                    "趋势图表",
                    id="branch-trend-chart-button",
                    style={
                        'backgroundColor': '#1890ff',
                        'color': 'white',
                        'border': '1px solid #4a5f9a',
                        'padding': '6px 12px',
                        'borderRadius': '4px',
                        'fontSize': '12px'
                    }
                )
            ], style={'float': 'right'})
        ], style={'marginBottom': '10px', 'overflow': 'hidden'}),
        html.Div([
            # 在布局中添加这个容器
            html.Div(id='equipment-detail-output', style={'display': 'none'}),
           
            dash_table.DataTable(
                id='branch-detail-preview-table',
                columns=[
                    
                    {'name': '设备名称', 'id': '设备名称'},
                    {'name': '设备型号', 'id': '设备型号'},
                    {'name': '设备金额', 'id': '设备金额'},
                    # {'name': '折旧金额', 'id': '折旧金额'},
                    {'name': '年限指数', 'id': '年限指数'},
                    {'name': '设备ID', 'id': 'product_id'}  # 添加 product_id 列
                ],
                data=table_data,
                # 移除 row_selectable 和 selected_rows，不再需要行选择
                # row_selectable='single',  # 注释掉这一行
                # selected_rows=[],  # 注释掉这一行
                style_cell={
                    'backgroundColor': '#1a2b5c',
                    'color': 'white',
                    'fontSize': '14px',
                    'textAlign': 'left',
                    'padding': '6px',
                    'border': '1px solid #2a3f7a'
                },
                style_cell_conditional=[
                        {
                            'if': {'column_id': '设备名称', 'filter_query': '{设备名称} != "设备名称"','filter_query': '{设备名称} != ""' },
                            'textDecoration': 'underline',
                            'cursor': 'pointer'
                        },
                       
                    ],
                style_header={
                    'backgroundColor': '#2a3f7a',
                    'color': 'white',
                    'fontWeight': 'bold',
                    'fontSize': '14px',
                    'textDecoration': 'none'
                },
                page_size=10,
                page_action='native',
                page_current=0,
                style_table={'overflowX': 'auto'},
            )
        ]),
        # 添加显示结果数量的控件
        html.Div(
            id='branch-result-count-display',
            children=f"共 {len(table_data)} 条记录",
            style={
                'color': 'white',
                'fontSize': '12px',
                'marginTop': '10px',
                'textAlign': 'right'
            }
        ),
    ], style={
        "backgroundColor": "#101b41",
        "border": "1px solid #444",
        "padding": "15px",
        "height": "95%"
    })

# 创建底部状态栏
def create_bottom_status_bar():
    return html.Div([
        html.Span('急救及生命支持0/0', style={'color': 'white', 'fontSize': '16px'}),
        html.Span('不良事件0', style={'color': 'white', 'fontSize': '16px'}),
        html.Span('召回事件0', style={'color': 'white', 'fontSize': '16px'}),
        html.Span('维修超时0', style={'color': 'white', 'fontSize': '16px'}),
        html.Span('保养超时0', style={'color': 'white', 'fontSize': '16px'}),
        html.Span('强检提醒0', style={'color': 'white', 'fontSize': '16px'})
    ], style={
        "backgroundColor": "#006699",
        "height": "60px",
        "display": "flex",
        "alignItems": "center",
        "justifyContent": "space-around",
        "padding": "0 20px"
    })

